sf: Update status reg check in spi_flash_cmd_wait_ready
authorJagan Teki <[email protected]>
Wed, 2 Sep 2015 06:09:50 +0000 (11:39 +0530)
committerJagan Teki <[email protected]>
Sun, 25 Oct 2015 14:47:03 +0000 (20:17 +0530)
Current flash wait_ready logic is not modular to add new
register status check, hence updated the status check for
adding few more register checks in future.

Below are the sf speed runs with 'sf update' on whole flash, 16MiB.

=> sf update 0x100 0x0 0x1000000
device 0 whole chip
16777216 bytes written, 0 bytes skipped in 59.564s, speed 289262 B/s

=> sf update 0x100 0x0 0x1000000
device 0 whole chip
16777216 bytes written, 0 bytes skipped in 62.549s, speed 275036 B/s

=> sf update 0x100 0x0 0x1000000
device 0 whole chip
16777216 bytes written, 0 bytes skipped in 61.276s, speed 284359 B/s

Cc: Simon Glass <[email protected]>
Cc: Marek Vasut <[email protected]>
Cc: Michal Simek <[email protected]>
Cc: Siva Durga Prasad Paladugu <[email protected]>
Cc: Stefan Roese <[email protected]>
Cc: Tom Warren <[email protected]>
Cc: Tom Rini <[email protected]>
Tested-by: Jagan Teki <[email protected]>
Signed-off-by: Jagan Teki <[email protected]>
Tested-by: Bin Meng <[email protected]>
drivers/mtd/spi/sf_ops.c

index 6e457ecbfc1ae949d5b52f2c2d7bbbe273976c79..c820d48b6c0b37434347c47fd63136536bcc5b4f 100644 (file)
@@ -139,72 +139,27 @@ static void spi_flash_dual_flash(struct spi_flash *flash, u32 *addr)
 }
 #endif
 
-static int spi_flash_poll_status(struct spi_slave *spi, unsigned long timeout,
-                                u8 cmd, u8 poll_bit)
-{
-       unsigned long timebase;
-       unsigned long flags = SPI_XFER_BEGIN;
-       int ret;
-       u8 status;
-       u8 check_status = 0x0;
-
-       if (cmd == CMD_FLAG_STATUS)
-               check_status = poll_bit;
-
-#ifdef CONFIG_SF_DUAL_FLASH
-       if (spi->flags & SPI_XFER_U_PAGE)
-               flags |= SPI_XFER_U_PAGE;
-#endif
-       ret = spi_xfer(spi, 8, &cmd, NULL, flags);
-       if (ret) {
-               debug("SF: fail to read %s status register\n",
-                     cmd == CMD_READ_STATUS ? "read" : "flag");
-               return ret;
-       }
-
-       timebase = get_timer(0);
-       do {
-               WATCHDOG_RESET();
-
-               ret = spi_xfer(spi, 8, NULL, &status, 0);
-               if (ret)
-                       return -1;
-
-               if ((status & poll_bit) == check_status)
-                       break;
-
-       } while (get_timer(timebase) < timeout);
-
-       spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
-
-       if ((status & poll_bit) == check_status)
-               return 0;
-
-       /* Timed out */
-       debug("SF: time out!\n");
-       return -1;
-}
-
 int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
 {
-       struct spi_slave *spi = flash->spi;
-       int ret;
-       u8 poll_bit = STATUS_WIP;
-       u8 cmd = CMD_READ_STATUS;
+       u8 sr;
+       int timebase, ret;
 
-       ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
-       if (ret < 0)
-               return ret;
+       timebase = get_timer(0);
 
-       if (flash->poll_cmd == CMD_FLAG_STATUS) {
-               poll_bit = STATUS_PEC;
-               cmd = CMD_FLAG_STATUS;
-               ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
+       while (get_timer(timebase) < timeout) {
+               ret = spi_flash_cmd_read_status(flash, &sr);
                if (ret < 0)
                        return ret;
+
+               if (!(sr & STATUS_WIP))
+                       return 0;
+               else
+                       break;
        }
 
-       return 0;
+       printf("SF: Timeout!\n");
+
+       return -ETIMEDOUT;
 }
 
 int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,